package java学习.leetcode.editor.cn;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 刘世锦
 * 2022-11-22 23:11:34	 当前时间
 */
//给定一个 N 叉树，返回其节点值的层序遍历。（即从左到右，逐层遍历）。 
//
// 树的序列化输入是用层序遍历，每组子节点都由 null 值分隔（参见示例）。 
//
// 
//
// 示例 1： 
//
// 
//
// 
//输入：root = [1,null,3,2,4,null,5,6]
//输出：[[1],[3,2,4],[5,6]]
// 
//
// 示例 2： 
//
// 
//
// 
//输入：root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,
//null,13,null,null,14]
//输出：[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]
// 
//
// 
//
// 提示： 
//
// 
// 树的高度不会超过 1000 
// 树的节点总数在 [0, 10^4] 之间 
// 
// Related Topics 树 广度优先搜索 
// 👍 329 👎 0

public class N叉树的层序遍历{
	public static void main(String[] args) {
		Solution solution = new N叉树的层序遍历().new Solution();
		
	}
//leetcode submit region begin(Prohibit modification and deletion)
/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
	/**
	 * 相比较而言，就是二叉树多了分支
	 *
	 * _  5 6  _
	 *
	 * [1],[3,2,4]
	 * [[1],[3,2,4],[5,6]]
	 */
    public List<List<Integer>> levelOrder(Node root) {
		List<List<Integer>> result = new ArrayList<>();
		ArrayDeque<Node> deque = new ArrayDeque<>();
		if (root!=null){
			deque.offer(root);
			while (!deque.isEmpty()){
				int len = deque.size();
				List<Integer> arrayList = new ArrayList<>();
				while (len>0){
					Node node = deque.poll();
					arrayList.add(node.val);
					for (int i = 0; i < node.children.size(); i++) {
						deque.offer(node.children.get(i));
					}
					len--;
				}
				result.add(arrayList);
			}
		}
		return result;
    }
}

	class Node {
		public int val;
		public List<Node> children;

		public Node() {}

		public Node(int _val) {
			val = _val;
		}

		public Node(int _val, List<Node> _children) {
			val = _val;
			children = _children;
		}
	};
//leetcode submit region end(Prohibit modification and deletion)

}
